/**
 * Created by X250 on 2017/5/13.
 */
//参考网址：http://www.cnblogs.com/0201zcr/p/4763806.html
public class QuickSort {

//    1.查找中轴（最低位作为中轴）所在位置
    /**
     * 查找出中轴（默认是最低位low）的在numbers数组排序后所在位置
     *
     * @param numbers 带查找数组
     * @param low   开始位置
     * @param high  结束位置
     * @return  中轴所在位置
     */
    public static int getMiddle(int[] numbers, int low,int high)
    {
//       int temp = numbers[(low+high)/2];//数组的中间作为中轴 -->  此方法行不通
//       交换第一个和数组中间的值，从而可以将数组的中间作为中轴
//       swap (numbers[low], numbers[(low+high)/2]);

        int temp = numbers[low]; //数组的第一个作为中轴
        while(low < high)
        {
            while(low < high && numbers[high] > temp)
            {
                high--;
            }
            numbers[low] = numbers[high];//比中轴小的记录移到低端
            while(low < high && numbers[low] < temp)
            {
                low++;
            }
            numbers[high] = numbers[low] ; //比中轴大的记录移到高端
        }//此循环跳转时，low=high
        numbers[low] = temp ; //中轴记录到尾
        return low ; // 返回中轴的位置
    }

    public static void swap(int a , int b) {
        int temp;
        temp = a;
        a = b;
        b = temp;
    }

//    1.查找中轴（最低位作为中轴）所在位置
    /**
     *
     * @param numbers 带排序数组
     * @param low  开始位置
     * @param high 结束位置
     */
    public static void quickSort(int[] numbers,int low,int high)
    {
        if(low < high)
        {
            int middle = getMiddle(numbers,low,high); //将numbers数组进行一分为二
            quickSort(numbers, low, middle-1);   //对低字段表进行递归排序
            quickSort(numbers, middle+1, high); //对高字段表进行递归排序
        }


//    分析：
//    采用了一种分治的策略
//　　快速排序是通常被认为在同数量级（O(n*log2n)）的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时，快排序反而蜕化为冒泡排序。
//    为改进之，通常以“三者取中法”来选取基准记录，即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。

    }

//3、快速排序提供方法调用
    /**
     * 快速排序
     * @param numbers 带排序数组
     */
    public static void quick(int[] numbers)
    {
        if(numbers.length > 0)   //查看数组是否为空
        {
            quickSort(numbers, 0, numbers.length-1);
        }
    }

    public static void main(String[] args)
    {
//        int[] numbers = {10,20,15,0,6,7,2,1,-5,55};
        int[] numbers = {72,6,57,88,60,42,83,73,48,85};
        System.out.print("排序前：");
        printArr(numbers);

//        bubbleSort(numbers);
//        System.out.print("冒泡排序后：");
//        printArr(numbers);


        quick(numbers);
        System.out.print("快速排序后：");
        printArr(numbers);
    }


    public static void printArr(int[] numbers)
    {
        for(int i = 0 ; i < numbers.length ; i ++ )
        {
            System.out.print(numbers[i] + ",");
        }
        System.out.println("");
    }
}
